#pragma once

#include <iostream>
#include <string>
#include <fstream>

// 工具类

class Util
{
public:
    // 读取文件内容
    static bool ReadFileContent(const std::string &filename, std::string *out)
    {
        out->clear();
        // version-1: 默认是以文本方式读取文件的，图片是二进制的
        // std::ifstream in(filename); // 读入文件流
        // if(!in.is_open())
        // {
        //     return false;
        // }
        // std::string line;
        // while(std::getline(in, line)) // 从文件流里读出去
        // {
        //     *out += line;
        // }
        // in.close();
        // return true;

        // version-2: 以二进制方式进行读取
        int filesize = FileSize(filename);
        if(filesize > 0)
        {
            std::ifstream in(filename);
            if(!in.is_open())
                return false;
            out->resize(filesize);
            in.read((char*)(out->c_str()), filesize); // 向缓冲区里写filesize大小的字符串
            in.close();
        }
        else
        {
            return false;
        }

        return true;
    }

    // 提取一行
    static bool ReadOneLine(std::string &bigstr, std::string *out, const std::string &sep)
    {
        auto pos = bigstr.find(sep); 
        if(pos == std::string::npos)
            return false;
            
        *out = bigstr.substr(0, pos); // 提取到了一行
        bigstr.erase(0, pos + sep.size()); // 移除
        return true;
    }

    // 获取文件大小
    static int FileSize(const std::string &filename)
    {
        std::ifstream in(filename, std::ios::binary); // 二进制流的方式打开
        if(!in.is_open())
            return -1;
        in.seekg(0, in.end); // 以当前位置为参考点, 移动到文件流结尾
        int filesize = in.tellg(); // 返回从文件开头算起的当前字节位置的整数
        in.seekg(0, in.beg); // 把指针再倒回卷轴开头
        in.close();
        return filesize;
    }
};